package com.jboost.modules.app.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.jboost.common.api.vo.Result;
import com.jboost.modules.app.constant.BaseResult;
import com.jboost.modules.app.dto.BomItem;
import com.jboost.modules.app.util.StrategyFactory;
import com.jboost.modules.system.entity.FhdBom;
import com.jboost.modules.system.entity.FhdProductDz;
import com.jboost.modules.system.mapper.FhdBomMapper;
import com.jboost.modules.system.mapper.FhdProductMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;

@Api(tags = "客户管理")
@RestController
@RequestMapping("/fhd")
@Slf4j
@AllArgsConstructor
public class FhdController {



    StrategyFactory strategyFactory;

    FhdProductMapper fhdProductMapper;
    FhdBomMapper fhdBomMapper;

    @PostMapping(value = "/push")
    @ApiOperation(value = "数据推送", notes = "数据推送")
    public void push(@RequestBody JSONObject jsonObject, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        strategyFactory.invokeStrategy(jsonObject,"FhdProductQuery");
    }

    @GetMapping(value = "/orderInfo")
    @ApiOperation(value = "订单bom清单", notes = "订单bom清单")
    public Map orderInfo(@RequestParam("ids") String ids,@RequestParam("nums") Integer nums) throws Exception {
        List<FhdBom> fhdBoms = new ArrayList<>();
        String[] split = ids.split(",");
        for (String s : split) {
            FhdProductDz fhdProductDz = fhdProductMapper.selectById(s);
            LambdaQueryWrapper<FhdBom> eq = Wrappers.lambdaQuery(FhdBom.class)
                    .eq(StringUtils.isNotEmpty(fhdProductDz.getName()), FhdBom::getName, fhdProductDz.getName())
                    .and(q->q.eq(StringUtils.isNotEmpty(fhdProductDz.getZgxl()), FhdBom::getZgxl, fhdProductDz.getZgxl()).or()
                            .eq(StringUtils.isNotEmpty(fhdProductDz.getDjms()), FhdBom::getDjms, fhdProductDz.getDjms())
                    .or()
                    .eq(StringUtils.isNotEmpty(fhdProductDz.getGdfx()), FhdBom::getGdfx, fhdProductDz.getGdfx())
                    .or()
                    .eq(StringUtils.isNotEmpty(fhdProductDz.getYwlg()), FhdBom::getYwlg, fhdProductDz.getYwlg())
                    .or().eq(StringUtils.isNotEmpty(fhdProductDz.getJxys()), FhdBom::getJxys, fhdProductDz.getJxys())
                                    .eq(StringUtils.isNotEmpty(fhdProductDz.getMbta()), FhdBom::getMbta, fhdProductDz.getMbta())
                    .or()
                    .eq(StringUtils.isNotEmpty(fhdProductDz.getTycs()), FhdBom::getTycs, fhdProductDz.getTycs()));
            List<FhdBom> fhdBoms1 = fhdBomMapper.selectList(eq);

            fhdBoms.addAll(fhdBoms1);
        }

        List<BomItem> bomItemList1 = new ArrayList<>();

        List<BomItem> collect1 = fhdBoms.stream().map(e -> JSONArray.parseArray(e.getChilds(), BomItem.class)).flatMap(Collection::stream).collect(Collectors.toList());

        collect1.forEach(e->{
            if (Objects.equals(e.getB_yjfl(),"组件")){
                LambdaQueryWrapper<FhdBom> eq = Wrappers.lambdaQuery(FhdBom.class).eq(FhdBom::getWlbh,e.getB_wlbh());
                FhdBom fhdBom = fhdBomMapper.selectOne(eq);
                if (Objects.nonNull(fhdBom)){
                    bomItemList1.addAll(JSONArray.parseArray(fhdBom.getChilds(), BomItem.class));
                }

            }else {
                bomItemList1.add(e);
            }
        });

        Map<String, List<BomItem>> collect = bomItemList1.stream()
                .collect(Collectors.groupingBy(BomItem::getB_wlbh));
        List<Map>  list = new ArrayList();
        Set<Map.Entry<String, List<BomItem>>> entries = collect.entrySet();
        for (Map.Entry<String, List<BomItem>> entry : entries) {
            Map map = new HashMap();
            map.put("wlbh",entry.getKey());
            BomItem bomItem = entry.getValue().get(0);
            map.put("yjfl",bomItem.getB_yjfl());
            map.put("erjfl",bomItem.getB_erjfl());
            map.put("wlmc",bomItem.getB_name());
            map.put("dw",bomItem.getB_dw());
            Integer bBzyl = bomItem.getB_bzyl();
            if(Objects.isNull(bBzyl)){
                bBzyl =1;
            }
            map.put("yl",entry.getValue().size()*bBzyl*nums);
            list.add(map);
        }

        Map<String,List<Map>> maps = new HashMap<>();
        maps.put("wlqdhz",list);
//        Map<String, List<FhdBom>> bomMap = fhdBoms.stream()
//                .collect(Collectors.groupingBy(FhdBom::getWlbh));
//        List<Map>  yjlist = new ArrayList();
//        for (Map.Entry<String, List<FhdBom>> entry : bomMap.entrySet()) {
//            Map map = new HashMap();
//            FhdBom fhdBom = entry.getValue().get(0);
//            map.put("wlbh",fhdBom.getWlbh());
//            map.put("yjfl",fhdBom.getYjfl());
//            map.put("erjfl",fhdBom.getErjfl());
//            map.put("wlmc",fhdBom.getName());
//            map.put("dw",fhdBom.getDw());
//            map.put("yl",entry.getValue().size());
//            map.put("bomno",fhdBom.getBomno());
//            List<BomItem> bomItems = JSONArray.parseArray(fhdBom.getChilds(), BomItem.class);
//            if (CollectionUtils.isNotEmpty(bomItems)){
//                map.put("xj","是");
//            }else {
//                map.put("xj","否");
//            }
//            map.put("bmjh",bomItems.stream().map(BomItem::getB_wlbh).collect(Collectors.joining(",")));
//            map.put("ylcf",entry.getValue().size());
//            yjlist.add(map);
//        }
//        maps.put("yjfl",yjlist);



      return  maps;

    }

}
